home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Utilities / mbprintf-c.txt
Internet Message Format  |  1994-03-23  |  3KB

  1. Date: Wed, 2 Dec 92 16:28:25 PST
  2. From: macmod@SUMEX-AIM.Stanford.EDU (Info-Mac Moderator)
  3.  
  4. orrow.stanford.edu!stanford.edu!agate!ucbvax!hplabs!sdd.hp.com!elroy.j        pl.nasa.gov!usc!davidp 
  5. From: davidp@calvin.usc.edu (David Peterson) 
  6. Newsgroups: comp.sys.mac.programmer 
  7. Subject: Just for you, an early Christmas present 
  8. Message-Id: <1fj5ksINNo34@calvin.usc.edu> 
  9. Date: 2 Dec 92 20:17:32 GMT 
  10. Reply-To: davidp@usc.edu 
  11. Organization: University of Southern California, Los Angeles, CA 
  12. Lines: 99 
  13. Nntp-Posting-Host: calvin.usc.edu 
  14. Apparently-To: info-mac 
  15. Resent-To: backmod
  16. Resent-Date: Wed, 2 Dec 1992 16:28:22 PST
  17. Resent-From: Info-Mac Moderator <macmod@sumex-aim.Stanford.EDU>
  18.  
  19.  
  20.  
  21. Now you, the Mac programmer, can have pages of useless strings effortlessly
  22. vomited to your screen just like your DOS and UNIX friends do.
  23.  
  24. With this dandy new MBPrintf routine you can make up printf style diagnostic
  25. messages and have them show up in MacsBug correctly interpreted and formatted.
  26.  
  27. Okay, so this is just a little hack I threw together with a liberal amount
  28. copyright infringment (see pg 156 of K&R). After a few hours of using it
  29. I found it extremely useful, and it has earned a permanent place in my 
  30. personal library (not unlike every other snippet of code I come across).
  31.  
  32. Hopefully you will find it just as useful, but (as always) your mileage
  33. may vary.
  34.  
  35. Handy tip:
  36.     Instead of putting a '\n' at the end of your string try a semi-colon
  37.     followed by Your Favorite MacsBug Command. ';g' is probably the most
  38.     useful and ';s 3' will take you back to the instruction right after
  39.     the JSR into this function. Combinations of ';dx off'/';dx on' could
  40.     be good too.
  41.  
  42. Caveats:
  43.     This will probably blow up if called from interupt. It makes calls
  44.     into the StdCLib segment which may or may not be loaded.
  45.  
  46.     Probably won't work in stand alone code resources because the
  47.     aforementioned code segment contains global data.
  48.  
  49.     I don't know what will happen if your string gets over 255 characters,
  50.     but it probably won't be what you expected.
  51.  
  52.  
  53. -dave.
  54.  
  55. ---------------------------
  56.  
  57. #include <StdArg.h>
  58. #include <StdIO.h>
  59.  
  60. void MBPrintf(char* form, ...);
  61.  
  62. void
  63. MBPrintf(char* form, ...)
  64. {
  65.     va_list    ap;
  66.     char*    p;
  67.  
  68.     char*    sval;
  69.     int        ival;
  70.     double    dval;
  71.  
  72.     char    string[256];
  73.     char*    strp;
  74.     char*    strb;
  75.     
  76.     strp = &string[1];
  77.     strb = &string[1];
  78.     
  79.     va_start(ap, form);
  80.     
  81.     for (p = form; *p; p++) {
  82.         if (*p != '%') {
  83.             *strp++ = *p;
  84.             continue;
  85.         }
  86.         
  87.         switch (*++p) {
  88.             case 'd':
  89.                 ival = va_arg(ap, int);
  90.                 sprintf(strp, "%d", ival);
  91.                 while (*++strp);
  92.                 break;
  93.             case 'x':
  94.                 ival = va_arg(ap, int);
  95.                 sprintf(strp, "%x", ival);
  96.                 while (*++strp);
  97.                 break;
  98.             case 'f':
  99.                 dval = va_arg(ap, double);
  100.                 sprintf(strp, "%f", dval);
  101.                 while (*++strp);
  102.                 break;
  103.             case 's':
  104.                 for (sval = va_arg(ap, char*); *sval; sval++)
  105.                     *strp++ = *sval;
  106.                 break;
  107.             default:
  108.                 *strp++ = *p;
  109.                 break;
  110.         }
  111.     }
  112.     
  113.     va_end(ap);
  114.     
  115.     string[0] = strp - strb;
  116.     DebugStr((Str255) string);
  117. }
  118.  
  119.  
  120.